package br.unipar.academico.jsf.cadastroaluno;

import br.com.uniti.academico.persistence.entity.Usuario;
import br.com.uniti.academico.persistence.manager.usuario.UsuarioManager;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.springframework.beans.factory.annotation.Autowired;

public class UsuarioController {

    public final static String USUARIO_SESSION = "usuarioSession";
    @Autowired
    private UsuarioManager usuarioManager;
    @Autowired
    private NotificacaoController notificacaoController;
    private Usuario usuario = inicializaUsuario();

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    private String confirmacao;

    public String getConfirmacao() {
        return confirmacao;
    }

    public void setConfirmacao(String confirmacao) {
        this.confirmacao = confirmacao;
    }

    public Usuario inicializaUsuario() {
        Usuario u = new Usuario();
        return u;
    }

    public String limpar() {
        usuario = inicializaUsuario();
        return "CADASTRO_USUARIO";
    }

    public String salvar() {
        if (confirmacao.equals(usuario.getSenha())) {
            try {
                usuarioManager.salvar(usuario);
                usuario = inicializaUsuario();
                return "INDEX";
            } catch (IllegalArgumentException e) {
                notificacaoController.setNotificacao(e.getMessage());
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(
                    "cadastroUsuario:confirmacao",
                    new FacesMessage("Confirmacao de senha invalida."));

            notificacaoController.setNotificacao("Senha invalida.");
        }

        return "CADASTRO_USUARIO";
    }

    public String acessar() {

        boolean podeAcessar = false;
        try {
            podeAcessar = usuarioManager.acessar(usuario);
        } catch (IllegalArgumentException e) {
            notificacaoController.setNotificacao(e.getMessage());
            return "INDEX";
        }

        if (podeAcessar) {
            Usuario usuarioSession = new Usuario();
            usuarioSession.setEmail(usuario.getEmail());

            Map<String, Object> session = getSession();
            session.put(USUARIO_SESSION, usuarioSession);
        }
        usuario = new Usuario();
        return "INDEX";
    }

    public String getEmailSession() {
        Usuario usuarioSession = (Usuario) getSession().get(USUARIO_SESSION);
        if (usuarioSession != null) {
            return usuarioSession.getEmail();
        }
        return "NADA!!!!";
    }

    public String logoff() {
        getSession().remove(USUARIO_SESSION);
        return "INDEX";
    }

    public Map<String, Object> getSession() {
        return FacesContext.getCurrentInstance().
                getExternalContext().getSessionMap();
    }

    public String notificacao() {
        notificacaoController.setNotificacao("Teste de notificacao.");
        return "INDEX";
    }

    @Autowired
    private UsuarioReport usuarioReport;

    public String relatorio() {
        List<Usuario> lista = usuarioManager.buscarTodos();

        usuarioReport.visualizar(
                lista, "/usuarioReport.jasper", "RelatorioDeUsuario");

        return "INDEX";
    }
}
